package com.atguigu.dga.meta.service.impl;

import com.atguigu.dga.meta.bean.TableMetaInfo;
import com.atguigu.dga.meta.bean.TableMetaInfoExtra;
import com.atguigu.dga.meta.constants.MetaConst;
import com.atguigu.dga.meta.mapper.TableMetaInfoExtraMapper;
import com.atguigu.dga.meta.service.TableMetaInfoExtraService;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 元数据表附加信息 服务实现类
 * </p>
 *
 * @author zhangjunyi
 * @since 2023-06-05
 */
@Service
@DS("dga")
public class TableMetaInfoExtraServiceImpl extends ServiceImpl<TableMetaInfoExtraMapper, TableMetaInfoExtra> implements TableMetaInfoExtraService {

    @Override
    public void genExtraListByMetaList(List<TableMetaInfo> tableMetaInfoList) {
        //1.获取表名和库名 为了生成这个库下的这个表对应的辅助信息
        //  思考？ 如果这个表已经有辅助信息的话还需要生成吗？
        //        如何判断这个表有没有辅助信息? 有的话不再设置辅助信息  没有的话再去设置

        //创建存放辅助信息对象的集合
        ArrayList<TableMetaInfoExtra> tableMetaInfoExtraArrayList = new ArrayList<>();

        for (TableMetaInfo tableMetaInfo : tableMetaInfoList) {
            //根据表名和库名查询辅助信息表看有没有对应表的辅助信息
            TableMetaInfoExtra tableMetaInfoExtra = getOne(new QueryWrapper<TableMetaInfoExtra>().eq("schema_name", tableMetaInfo.getSchemaName()).eq("table_name", tableMetaInfo.getTableName()));

            //判断是否为空 如果是空的话证明没有辅助信息，需要生成
            if (tableMetaInfoExtra==null){
                //a.实例化对象
                tableMetaInfoExtra = new TableMetaInfoExtra();
                //表名 库名
                tableMetaInfoExtra.setTableName(tableMetaInfo.getTableName());
                tableMetaInfoExtra.setSchemaName(tableMetaInfo.getSchemaName());

                //生命周期类型
                tableMetaInfoExtra.setLifecycleType(MetaConst.LIFECYCLE_TYPE_UNSET);

                //安全级别
                tableMetaInfoExtra.setSecurityLevel(MetaConst.SECURITY_LEVEL_UNSET);


//                String a = "ods_order_info";

/*
                String dwLevel;
                if (a.startsWith("ods")){
                    dwLevel = MetaConst.DW_LEVEL_ODS;
                }
*/
                //根据表名去判断这个表所在的数仓层级
                tableMetaInfoExtra.setDwLevel(getInitDwLevelByTableName(tableMetaInfo.getTableName()));

                //创建时间
                tableMetaInfoExtra.setCreateTime(new Date());

                tableMetaInfoExtraArrayList.add(tableMetaInfoExtra);
            }
        }

        //将数据写入Mysql  第二个参数指的意思是 最多一批次写多少条数据 默认是1000条 可以手动设置
        saveBatch(tableMetaInfoExtraArrayList,500);
    }

    private String getInitDwLevelByTableName(String tableName){
        if(tableName.startsWith("ods")){
            return MetaConst.DW_LEVEL_ODS;
        } else if (tableName.startsWith("dwd")) {
            return MetaConst.DW_LEVEL_DWD;
        }else if (tableName.startsWith("dim")) {
            return MetaConst.DW_LEVEL_DIM;
        }else if (tableName.startsWith("dws")) {
            return MetaConst.DW_LEVEL_DWS;
        }else if (tableName.startsWith("ads")) {
            return MetaConst.DW_LEVEL_ADS;
        }else if (tableName.startsWith("dm")) {
            return MetaConst.DW_LEVEL_DM; //DM层 主要是一些特定的项目 临时使用 可以放在DM中
        }else  {
            return MetaConst.DW_LEVEL_OTHER;
        }
    }

}
